home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-10-14 | 3.7 KB | 127 lines | [TEXT/MPS ] |
- develop Newton Q&A Draft 2.3 10/14/94 Page 1
-
-
- /* Some code to generate the table used in IsASCIIAlpha4
- call func() begin
- s := Array(127, nil); // ASCII is 7 bit, so only need 127
- for i := 0 to 255 do begin
- local c := chr(i);
- if (c >= $a and c <= $z) or (c >= $A and c <= $Z) then
- s[i] := TRUE;
- end;
- s
- end with ();
- */
-
- IsASCIIAlpha1 := func(s)
- begin
- local c := Upcase(Clone(s)) ;
- local i ;
-
- for i := 0 to StrLen(c) - 1 do
- if (StrCompare(SubStr(c, i, 1), "A") < 0) OR
- (StrCompare(SubStr(c, i, 1), "Z") > 0) then
- return nil ;
- true ;
- end;
-
- IsASCIIAlpha2 := func(s)
- begin
- local i ;
- local c ;
-
- for i := 0 to StrLen(s) - 1 do
- begin
- // the assignment of the current character to the local c
- // is inlined in the first compare, this is faster.
- if not(((c := s[i]) >= $A AND c <= $Z) OR
- (c >= $a AND c <= $z)) then
- return nil ;
- end;
- true ;
- end;
-
- IsASCIIAlpha3 := func(s)
- begin
- local i ;
- local c := Upcase(Clone(s)) ;
-
- for i := 0 to StrLen(c) - 1 do
- if (c[i] < $A) OR (c[i] > $Z) then
- return nil ;
- true ;
- end;
-
- // this table was generated using the code above, simple cut
- // and paste :-)
- constant kAlphaTable := '[NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, NIL, NIL, NIL, NIL, NIL, NIL, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, NIL, NIL, NIL, NIL];
-
-
- IsASCIIAlpha4 := func(s) begin
- try
- for i := 0 to StrLen(s)-1 do
- if not kAlphaTable[ord(s[i])] then
- return NIL;
- TRUE;
-
- // this code only handles first 127 characters, if the string
- // contains a unicode character, the index will be
- // out of the bounds of the array. Instead of checking
- // the bounds in each loop iteration, use an exception
- // handler. This ads no time to the loop, but a bit of setup
- // time for the exception
- OnException |evt.ex.fr;type.ref.frame| do
- if ord(s[i]) > 127 then
- nil;
- else
- rethrow();
- end;
-
- call func()
- begin
- local longPass := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- local longFail := longPass & " ";
-
- local timeFunc := func(targetFunc, s1, s2)
- begin
- local t := Ticks() ;
- for i := 1 to 100 do
- begin
- call targetFunc with (s1) ;
- call targetFunc with (s2) ;
- end;
- Ticks() - t ;
- end;
-
- Print("Long Strings ---------------") ;
-
- print("IsASCIIAlpha1: " & call timeFunc with (IsASCIIAlpha1, longPass, longFail)) ;
- print("IsASCIIAlpha2: " & call timeFunc with (IsASCIIAlpha2, longPass, longFail)) ;
- print("IsASCIIAlpha3: " & call timeFunc with (IsASCIIAlpha3, longPass, longFail)) ;
- print("IsASCIIAlpha4: " & call timeFunc with (IsASCIIAlpha4, longPass, longFail)) ;
-
- Print("\nShort Strings --------------") ;
-
- print("IsASCIIAlpha1: " &
- call timeFunc with (IsASCIIAlpha1, "a", "a ")) ;
- print("IsASCIIAlpha2: " &
- call timeFunc with (IsASCIIAlpha2, "a", "a ")) ;
- print("IsASCIIAlpha3: " &
- call timeFunc with (IsASCIIAlpha3, "a", "a ")) ;
- print("IsASCIIAlpha4: " &
- call timeFunc with (IsASCIIAlpha4, "a", "a ")) ;
- end with () ;
-
- "Long Strings ---------------"
- "IsASCIIAlpha1: 5078"
- "IsASCIIAlpha2: 2389"
- "IsASCIIAlpha3: 1981"
- "IsASCIIAlpha4: 1176"
- "
- Short Strings --------------"
- "IsASCIIAlpha1: 180"
- "IsASCIIAlpha2: 111"
- "IsASCIIAlpha3: 107"
- "IsASCIIAlpha4: 79"
- #2 NIL
-